#ifndef SGU_REAL_H
#define SGU_REAL_H

SGU_NS_BEGIN

extern const real AUREA;    // parte aurea
extern const real COAUREA;

extern const real NaN;
real real_NaN();


// solves the 1st degree equation a*x+b=0
real solve1G(real a, real b);

// solves the 2nd degree equation a*x^2 + b*x + c = 0
// puts the lower solution in x1, and the higher in x2
// returns true id delta>=0
// if delta < 0 returns false, x1 and x2 are unchanged
std::pair<real,real> solve2G(real a, real b, real c);

real round(real x); /// rounds x to the neraest integer value

real angle_0_2Pi(real alfa);     /// porta l'angolo alfa nel range [0..2*Pi)
real angle_Pi_Pi(real alfa);     /// porta l'anfolo alfa nel range [-Pi..Pi)

real stirling(real x);                  /// formula di Stirling per il fattoriale
natural factorial(natural);               /// fattoriale esatto
real fibonacciGen(real x);              /// numeri di Fibonacci, generati con formula
natural fibonacci(natural);               /// numeri di Fibonacci, calcolati per iterazione


void solveC2G(const Complex & a, const Complex & b, const Complex & c, Complex & x1, Complex & x2);
// risolve in campo complesso un' equazione di secondo grado del tipo :
// a*x^2 + b*x + c = 0, le soluzioni sono messe in x1 e x2


SGU_NS_END

#endif
